{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# NetworkX Tutorial"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "NetworkX是创建，操纵和挖掘图形最常用的Python软件包之一。\n",
    "\n",
    "Setup"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Import the NetworkX package\n",
    "import networkx as nx"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Graph\n",
    "\n",
    "NetworkX提供了几个类来存储不同类型的图，比如有向图和无向图。它还提供了创建多重图(有向和无向)的类。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "False\n",
      "{}\n",
      "True\n",
      "{'Name': 'Bar'}\n"
     ]
    }
   ],
   "source": [
    "# Create an undirected graph G\n",
    "G = nx.Graph()\n",
    "print(G.is_directed())\n",
    "\n",
    "#prw\n",
    "print(G.graph)\n",
    "\n",
    "# Create a directed graph H\n",
    "H = nx.DiGraph()\n",
    "print(H.is_directed())\n",
    "\n",
    "# Add graph level attribute\n",
    "G.graph[\"Name\"] = \"Bar\"\n",
    "print(G.graph)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'networkx.classes.graph.Graph'>\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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Bshu5z3ZADxDoQQMFhkZqenTp2vt2rX68ssvlZSUpNmzZ4sTu+Arx48f19ixY5WYmKjPPvtMy5cvV1ZWli655BKzowEIEhRKwEd+97vfKS8vT7169VLfvn1166236uuvvzY7FoLcxo0bdc011+jZZ5/VI488ovz8fN1xxx1mxwIQZCiUgA9deOGFmjNnjlatWqW8vLyfDkNnthLeVlZWpoceekgdOnRQZGSktm3bpokTJ+qCCy4wOxqAIEShBExw6623ateuXbrzzjt133336c4779Q333xjdiwEAbfbrYULF6pNmzZavHixZsyYoY8++khXX3212dEABDEKJWCSBg0a6JVXXtHSpUu1ZcsWJSYmatGiRcxW4rwVFhaqa9eu6tOnj1JTU/XFF1/okUcekc1mMzsagCBHoQRMduedd2rXrl36/e9/rz/96U/64x//qG+//dbsWAggVVVV+vvf/66kpCR9+eWXevfdd7V48WI1bdrU7GgAQoTFzXQI4DeWLFmifv36yWq1atasWUpLSzM7EvzcunXr9PDDD6uoqEiDBg3Sc889p4iICLNjAQgxzFACfiQjI0P5+fm66aab1KNHD/Xp00dlZWVmx4IfOnjwoO6//3517txZDRs21I4dO/TPf/6TMgnAFBRKwM80adJEWVlZeu2117Ry5Uq1bdtWq1atMjsW/ITb7db8+fPVpk0bLV26VLNnz9aGDRvUtm1bs6MBCGEUSsAPWSwW9enTR7t27dLVV1+tbt266YEHHtDhw4fNjgYTffHFF0pNTdX999+vW265RV988YUefPBBWa38Uw7AXPwrBPixuLg4rVy5Ui+99JKWLFmipKQkrV271uxYOIeKKqfyiw9rh+OQ8osPq6LK6dF4R48e1fDhw9WuXTv997//1Zo1a7RgwQI1adLES4kBwDNsygECxN69e/XAAw/o/fffV79+/TR+/HgOqfYjhQfKtTDXoZzdJXKUVerUf1gtkuIbRii1dYx6p8SrZZOoGo978u97z549Gjp0qP72t7+pXr16Xs8PAJ6gUAIBxOVyaebMmRo8eLAuvvhizZs3T506dTI7VkjbV1apYdl52lB0UDarRdWuM/+TevLzjgnRykxLUrOGZ95AU1JSoqeeekoLFixQp06dNHPmTF1xxRVG/BEAwGMseQMBxGq16pFHHtGnn36quLg4de7c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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#PRW\n",
    "H = nx.path_graph(10)\n",
    "print(type(H))\n",
    "nx.draw(H)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Node\n",
    "\n",
    "节点(带有属性)可以很容易地添加到NetworkX图中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Node 0 has the attributes {'feature': 0, 'label': 0}\n"
     ]
    }
   ],
   "source": [
    "# Add one node with node level attributes\n",
    "G.add_node(0, feature=0, label=0)\n",
    "\n",
    "# Get attributes of the node 0\n",
    "node_0_attr = G.nodes[0]\n",
    "print(\"Node 0 has the attributes {}\".format(node_0_attr))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(0, {'feature': 0, 'label': 0})\n",
      "(1, {'feature': 1, 'label': 1})\n",
      "(2, {'feature': 2, 'label': 2})\n",
      "G has 3 nodes\n"
     ]
    }
   ],
   "source": [
    "# Add multiple nodes with attributes\n",
    "G.add_nodes_from([\n",
    "  (1, {\"feature\": 1, \"label\": 1}),\n",
    "  (2, {\"feature\": 2, \"label\": 2})\n",
    "])\n",
    "\n",
    "# Loop through all the nodes\n",
    "# Set data=True will return node attributes\n",
    "for node in G.nodes(data=True):\n",
    "  print(node)\n",
    "\n",
    "# Get number of nodes\n",
    "num_nodes = G.number_of_nodes()\n",
    "print(\"G has {} nodes\".format(num_nodes))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Edge\n",
    "\n",
    "与节点类似，边(带有属性)也可以很容易地添加到NetworkX图中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Edge (0, 1) has the attributes {'weight': 0.5}\n"
     ]
    }
   ],
   "source": [
    "# Add one edge with edge weight 0.5\n",
    "G.add_edge(0, 1, weight=0.5)\n",
    "\n",
    "# Get attributes of the edge (0, 1)\n",
    "edge_0_1_attr = G.edges[(0, 1)]\n",
    "print(\"Edge (0, 1) has the attributes {}\".format(edge_0_1_attr))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": "{'weight': 0.5}"
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#PRW\n",
    "G.edges[0, 1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(0, 1)\n",
      "(0, 2)\n",
      "(1, 2)\n",
      "G has 3 edges\n"
     ]
    }
   ],
   "source": [
    "# Add multiple edges with edge weights\n",
    "G.add_edges_from([\n",
    "  (1, 2, {\"weight\": 0.3}),\n",
    "  (2, 0, {\"weight\": 0.1})\n",
    "])\n",
    "\n",
    "# Loop through all the edges\n",
    "# Here there is no data=True, so only the edge will be returned\n",
    "for edge in G.edges():\n",
    "  print(edge)\n",
    "\n",
    "# Get number of edges\n",
    "num_edges = G.number_of_edges()\n",
    "print(\"G has {} edges\".format(num_edges))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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LtiZ4eWFhYWaM2cOZRLwUgMHDpTT6VRycrJGjBght9ttdST4OX5lAXDB/va3vyk9PV3Lli1jeDng5YYMGaLZs2frlltukc1m08cff6yQkBCrY8FPsUIJ4ILMnTtX//jHP/SPf/xDkZGRVscBcAHi4+OVkJCghIQE3XPPPSopKbE6EvwUK5QA/tCOHTv05z//WXFxcXr88cetjgPgItx8881yu90aPny4bDabpk2bpuBg1pNQtiiUAM4rLy9PhmGoUaNG+uijj3gSDuCDhg0bJrfbrTvvvFM2m03vvvsu/y+jTFEoAZzTmeHlu3bt0vr16xleDviwESNGyOVyadSoUbLZbHr77bcplSgzFEoA5/Svf/1Ls2bN0meffaZ27dpZHQdAKY0cOVJut1v333+/7Ha7Jk+eTKlEmaBQAvhd69at01//+lc9/PDDGjZsmNVxAJSR++67T263Ww8++KDsdrteeeUVSiVKjUIJ4DcOHz4sh8OhDh066PXXX7c6DoAyNnr0aLndbo0dO1Y2m00vvvgipRKlQqEE8F/cbreGDRsml8ulL774guHlgJ8aM2aMXC6XHnvsMdntdk2cONHqSPBhFEoA/+Vvf/ubMjIytGzZMjVp0sTqOADK0aOPPiq3260nn3xSdrtdTz/9tNWR4KMolADOSk5O1iuvvKJXX31VvXr1sjoOgAowfvx4uVwuPfPMM7Lb7XriiSesjgQfRKEEIOn/hpffeeedio+P12OPPWZ1HAAV6JlnnpHL5dL48eNls9k0btw4qyPBx1AoASgvL0/x8fFq3Lgxw8uBADVx4kS5XC49+uijstlsGjNmjNWR4EMolECA83g8uu+++7R7925t2LBBtWrVsjoSAAsEBQXppZdeOnv3t91u1wMPPGB1LPgICiUQ4KZOnarPPvtMCQkJuu6666yOA8BCQUFBmjRpklwul0aPHi2bzaZ7773X6ljwARRKIICtXbtW48aN09ixY3XbbbdZHQeAFwgKCtIbb7xx9ok6NptNd999t9Wx4OWCPB6Px+oQACreoUOHFBoaqquuukrp6emy2+1WRwLgRTwej0aPHq1p06Zp5syZGjFihNWR4MVYoQQCkNvt1m233abi4mLNmTOHMgngN4KCgjR16lS53W7dddddstlsPIYV50ShBALQ008/rczMTKWlpemKK66wOg4ALxUcHKxp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WFiYevTooeTkZIaXA36qpKREGzZsOFsi9+zZo7p16yo2NlaGYah3794cdQECAIUSZe706dPq2rWrTp06pY0bN6p27dpWRwJQhoqLi7V69eqzN9bs379fDRs2VFxcnBwOhyIiImS3262OCaACcYYSZcrj8Wj06NHatm2b1q5dS5kE/ITb7daKFStkmqaSkpJ06NAhNWnSRPHx8TIMQ927d1dISIjVMQFYhEKJMvX+++/r448/1syZM3XDDTdYHQdAKRQVFSktLU1Op1Nz585Vdna2rrzySg0fPlyGYahTp04cZwEgiS1vlKGsrCx1795do0aN0rvvvmt1HACX4PTp00pNTZVpmpo3b55OnjypVq1ayeFwyOFwKDQ0VEFBQVbHBOBlKJQoE0ePHlVYWJguv/xy5k0CPiYvL08LFy6UaZpasGCBcnNzdd1118kwDBmGofbt21MiAZwXhRKlVlxcrOjoaH355ZfavHmzmjVrZnUkAH8gJydH8+fPl9Pp1OLFi3X69GndeOONcjgcMgxD1157rdURAfgQzlCi1CZOnKi0tDQtWbKEMgl4sWPHjmnevHkyTVOpqakqKipSx44dNXHiRBmGoauvvtrqiAB8FCuUKJX58+dryJAhevnll/XUU09ZHQfA/zh8+LCSk5NlmqaWL1+u4uJidevWTYZhKD4+nidYASgTFEpcsl27dqlDhw7q2bOnkpKSuNsT8BIHDhxQUlKSnE6nVq5cKUmKiIiQw+FQXFycGjdubHFCAP6GQolLkp+fr65duyo3N5fh5YAX2Lt379lB42vWrFFISIh69+4twzAUGxurBg0aWB0RgB/jDCUu2pnh5du3b9e6desok4BFdu3aJdM05XQ6lZWVpUqVKql///766KOPFBMTozp16lgdEUCAoFDiok2fPl0zZ87UJ598ouuvv97qOEBA+f7778+WyK+//lpVq1ZVdHS0HnnkEQ0aNEi1atWyOiKAAMSWNy7Khg0b1KNHD91zzz2aOnWq1XEAv+fxeLRlyxY5nU6ZpqmtW7eqRo0aGjx4sAzDUHR0tKpXr251TAABjkKJC3b06FGFhobqiiuuUEZGBsPLgXLi8Xi0adOmsyuRO3fu1GWXXaaYmBg5HA7169dPVapUsTomAJxFocQFKS4u1oABA/T1119r8+bNatq0qdWRAL9SUlKidevWnb2x5qefflK9evUUGxsrh8OhqKgoVapUyeqYAPC7OEOJC/Lss89q+fLlWrp0KWUSKCPFxcVatWqVnE6nEhMTdeDAATVq1Ejx8fEyDEMRERGy2fiYBuD9+KTCH5o3b55eeukl/eMf/1BUVJTVcQCf5nK5tGLFCjmdTiUnJ+vw4cNq2rSpbr75ZhmGoa5duyokJMTqmABwUdjyxnnt3LlTHTp0UK9evZSUlKSgoCCrIwE+p7CwUMuWLZNpmpo7d66OHTumq666SoZhyOFwKDw8nAcDAPBpFEqcU35+vrp06aL8/Hxt3LhRl112mdWRAJ9x+vRpLVmyRE6nUykpKcrJyVGbNm3kcDhkGIZuuukmfkED4DfY8sbv8ng8+stf/qIdO3Zo/fr1lEngAuTm5mrhwoVyOp1auHCh8vLy1K5dO40bN06GYei6666jRALwSxRK/K733ntPn3zyiWbNmqX27dtbHQfwWidPnlRKSopM09TixYtVUFCg0NBQTZgwQYZh6JprrrE6IgCUO7a88Rvr169Xjx49dN9992nKlClWxwG8TnZ2tubOnSvTNLV06VK5XC517txZhmEoPj5eLVu2tDoiAFQoCiX+y5EjRxQaGqqmTZsqIyODuXfAfxw6dEjJyclyOp1KT09XSUmJunfvLofDobi4ODVr1szqiABgGQolziouLlb//v31zTffMLwckLR//34lJibKNE1lZmYqKChIvXr1kmEYiouL0+WXX251RADwCpyhxFl/+9vflJ6ezvByBLQ9e/YoMTFRTqdTa9euld1uV+/evTV9+nQNHTpU9evXtzoiAHgdCiUkSXPnztU//vEPTZo0ieHlCDg7duw4+9zsTZs2qXLlyurfv7/+/e9/a8iQIapdu7bVEQHAq7HlDe3YsUMdOnRQ7969ZZomY00QELZu3Sqn0ynTNPXNN9+oWrVqGjhwoAzD0KBBg1SzZk2rIwKAz6BQBri8vDx16dJFBQUFysrKYt4k/JbH49HXX399tkT+8MMPqlmzpoYMGSLDMDRgwABVq1bN6pgA4JPY8g5gZ4aX79q1i+Hl8Esej0dZWVlnt7N3796t2rVra+jQoXrttdfUp08fValSxeqYAODzKJQB7F//+pdmzZqlzz77TO3atbM6DlAmSkpKtHbtWjmdTiUmJmrv3r2qX7++4uLi9O677yoyMpJxWABQxtjyDlDr1q1Tz5499Ze//EVvv/221XGAUnG73crMzJRpmkpMTNQvv/yiyy+/XIZhyDAM9ejRQzYbvz8DQHmhUAagw4cPKzQ0VM2bN9eKFStYrYFPcrlcWr58uUzTVFJSko4ePapmzZrJMAw5HA516dJFwcHBVscEgIBAoQwwbrdb/fv317fffqvNmzerSZMmVkcCLlhhYaGWLl0qp9OpefPm6fjx42rZsqUcDocMw1B4eDhTCgDAAuwBBZi//e1vysjI0LJlyyiT8An5+flavHixTNNUSkqKTp06pWuvvVajR4+Ww+HQDTfcQIkEAIuxQhlAkpOTFRcXp1dffVWPP/641XGAczp16pQWLFgg0zS1cOFC5efn6/rrrz+7nd22bVurIwIAfoVCGSDODC/v06ePnE4nKzrwOidOnFBKSoqcTqeWLFmiwsJChYWFnd3Obt26tdURAQDnQKEMAHl5eercubOKioqUlZWlWrVqWR0JkCQdPXpUc+fOldPpVFpamlwul7p06SKHw6H4+Hi1aNHC6ogAgAvAGUo/5/F4dN9992n37t3asGEDZRKWO3jwoJKSkmSaplasWKGSkhL17NlTkydPVnx8PGd7AcAHUSj93NSpU/XZZ58pISFB1113ndVxEKB+/vlnJSYmyul0atWqVQoODlZkZKSmTp2q2NhYNWrUyOqIAIBSYMvbj61du1YRERF64IEH9NZbb1kdBwHmxx9/lGmaMk1T69atk91uV9++fWUYhoYOHap69epZHREAUEYolH7qzPDyFi1aaPny5QwvR4XYvn27nE6nTNPU5s2bVaVKFQ0YMECGYWjw4MGqXbu21REBAOWAQumH3G63+vXrp61bt2rz5s264oorrI4EP+XxePTdd9+dLZHffvutqlevroEDB8rhcGjgwIGqUaOG1TEBAOWMM5R+6Omnn9bKlSuVlpZGmUSZ83g8+vLLL2WappxOp7Zv365atWppyJAheuGFF9S/f39VrVrV6pgAgArECqWfSUpKUnx8vF577TU99thjVseBn/B4PNqwYcPZlcgff/xRderUUWxsrAzDUJ8+fVS5cmWrYwIALEKh9CPbt29Xhw4d1K9fP33xxRcML0epFBcXa82aNWdvrPn555/VoEEDxcXFyeFwqFevXrLb7VbHBAB4AQqln8jLy1OnTp3kdruVlZWlmjVrWh0JPsjtdisj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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Draw the graph\n",
    "nx.draw(G, with_labels = True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 节点的度与邻居"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Node 1 has degree 2\n",
      "Node 1 has neighbor 0\n",
      "Node 1 has neighbor 2\n"
     ]
    }
   ],
   "source": [
    "node_id = 1\n",
    "\n",
    "# Degree of node 1\n",
    "print(\"Node {} has degree {}\".format(node_id, G.degree[node_id]))\n",
    "\n",
    "# Get neighbor of node 1\n",
    "for neighbor in G.neighbors(node_id):\n",
    "  print(\"Node {} has neighbor {}\".format(node_id, neighbor))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 其他功能\n",
    "\n",
    "NetworkX还提供了大量研究图表的有用方法。\n",
    "\n",
    "下面是一个获取节点PageRank的例子\n",
    "\n",
    "官方文档：https://networkx.org/documentation/stable/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": "{0: 0.17857162031103999,\n 1: 0.32142837968896,\n 2: 0.32142837968896,\n 3: 0.17857162031103999}"
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "num_nodes = 4\n",
    "# Create a new path like graph and change it to a directed graph\n",
    "G = nx.DiGraph(nx.path_graph(num_nodes))\n",
    "nx.draw(G, with_labels = True)\n",
    "\n",
    "# Get the PageRank\n",
    "pr = nx.pagerank(G, alpha=0.8)\n",
    "pr"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# PyTorch Geometric"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "PyTorch geometry (PyG)是PyTorch的扩展库。它为开发图深度学习模型提供了有用的基础，包括各种图神经网络层和大量的基准数据集。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'torch'",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mModuleNotFoundError\u001B[0m                       Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[12], line 1\u001B[0m\n\u001B[1;32m----> 1\u001B[0m \u001B[38;5;28;01mimport\u001B[39;00m \u001B[38;5;21;01mtorch\u001B[39;00m\n\u001B[0;32m      2\u001B[0m \u001B[38;5;28mprint\u001B[39m(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mPyTorch has version \u001B[39m\u001B[38;5;132;01m{}\u001B[39;00m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;241m.\u001B[39mformat(torch\u001B[38;5;241m.\u001B[39m__version__))\n",
      "\u001B[1;31mModuleNotFoundError\u001B[0m: No module named 'torch'"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "print(\"PyTorch has version {}\".format(torch.__version__))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Helper function for visualization.\n",
    "%matplotlib inline\n",
    "import torch\n",
    "import networkx as nx\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Visualization function for NX graph or PyTorch tensor\n",
    "def visualize(h, color, epoch=None, loss=None):\n",
    "    plt.figure(figsize=(7,7))\n",
    "    plt.xticks([])\n",
    "    plt.yticks([])\n",
    "\n",
    "    if torch.is_tensor(h):  #is_tensor(obj): Returns True if obj is a PyTorch tensor.\n",
    "        h = h.detach().cpu().numpy()\n",
    "        #https://pytorch.org/docs/stable/autograd.html?highlight=detach#torch.Tensor.detach\n",
    "        #pytorch .detach() .detach_() 和 .data用于切断反向传播https://blog.csdn.net/weixin_33913332/article/details/93300411\n",
    "        \n",
    "        #https://pytorch.org/docs/stable/tensors.html?highlight=cpu#torch.Tensor.cpu\n",
    "        #cpu():Returns a copy of this object in CPU memory.\n",
    "        \n",
    "        #https://pytorch.org/docs/stable/tensors.html?highlight=numpy#torch.Tensor.numpy\n",
    "        #Returns self tensor as a NumPy ndarray.\n",
    "        \n",
    "        plt.scatter(h[:, 0], h[:, 1], s=140, c=color, cmap=\"Set2\")\n",
    "        if epoch is not None and loss is not None:\n",
    "            plt.xlabel(f'Epoch: {epoch}, Loss: {loss.item():.4f}', fontsize=16)\n",
    "    else:\n",
    "        nx.draw_networkx(G, pos=nx.spring_layout(G, seed=42), with_labels=False,\n",
    "                         node_color=color, cmap=\"Set2\")\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据集\n",
    "PyTorch geometry通过torch_geometry提供了对数据集的简单访问。数据集分包:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from torch_geometric.datasets import KarateClub\n",
    "\n",
    "dataset = KarateClub()\n",
    "print(f'Dataset: {dataset}:')\n",
    "print('======================')\n",
    "print(f'Number of graphs: {len(dataset)}')\n",
    "print(f'Number of features: {dataset.num_features}')\n",
    "print(f'Number of classes: {dataset.num_classes}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "7b4b4feff2f24a0f0a34464dbe537a36fda679851528fb8735cb41fa49dffb2d"
  },
  "kernelspec": {
   "display_name": "Python 3.8.8 64-bit ('base': conda)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.12"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}